/*
 * Public Credit Information Sharing Platform(PCISP).
 * Copyright (c) 2019-2020 jsxzkingdee and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * Please visit https://www.zhengxinsoft.com if you need additional information or have any questions.
 */

package com.platform.comm.service;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.JPQLQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

/**
 * Common business interface for CMS & SYS
 *
 * @author coder
 */
public interface CommonBiz<T, ID> {

    /**
     * 保存
     *
     * @param entity T
     * @return T
     */
    T saveEntity(T entity);

    /**
     *  批量保存
     * @param entitys
     * @return
     */
    List<T> saveAllEntity(List<T> entitys);

    /**
     * 根据ID查询
     *
     * @param id ID
     * @return T
     */
    Optional<T> queryById(ID id);

    /**
     * 根据ID查询记录
     *
     * @param id ID
     * @return T
     * @throws javax.persistence.EntityNotFoundException 如果无法根据指定ID查询到记录，则扔出异常
     */
    T fetchById(ID id);

    /**
     * 查询单条记录
     *
     * @param predicate 条件
     * @return Optional
     */
    Optional<T> queryOne(Predicate predicate);

    /**
     * 查询单条记录
     *
     * @param predicate   条件
     * @param expressions 投影
     * @return Optional
     */
    Optional<Tuple> queryOne(Predicate predicate, Expression<?>... expressions);

    /**
     * 查询单条记录
     *
     * @param predicate 条件
     * @return T
     */
    T fetchOne(Predicate predicate);

    /**
     * 查询单条记录
     *
     * @param predicate   记录
     * @param expressions 投影
     * @return Tuple
     */
    Tuple fetchOne(Predicate predicate, Expression<?>... expressions);

    /**
     * 查询单条记录
     *
     * @param predicate 条件
     * @param consumer  条件
     * @return T
     */
    T fetchOne(Predicate predicate, Consumer<JPQLQuery<?>> consumer);

    /**
     * 查询单条记录
     *
     * @param predicate 条件
     * @return T
     */
    @Nullable
    T getOne(Predicate predicate);

    /**
     * 查询所有
     *
     * @param predicate 条件
     * @return List
     */
    List<T> queryAll(Predicate predicate);

    /**
     * 分页查询
     *
     * @param predicate 条件
     * @param pageable  分页参数
     * @return 分页列表
     */
    Page<T> queryByPage(Predicate predicate, Pageable pageable);

    /**
     * 分页查询
     *
     * @param predicate 条件
     * @param pageable  分页参数
     * @param consumer  条件
     * @return 分页列表
     */
    Page<T> queryByPage(Predicate predicate, Pageable pageable, Consumer<JPQLQuery<?>> consumer);

    /**
     * 查询所有
     *
     * @param predicate       条件
     * @param orderSpecifiers 排序
     * @return List
     */
    List<T> queryAll(Predicate predicate, OrderSpecifier... orderSpecifiers);

    /**
     * 查询所有
     *
     * @param predicate 条件
     * @param sort      排序
     * @return List
     */
    List<T> queryAll(Predicate predicate, Sort sort);

    /**
     * 统计
     *
     * @param predicate 条件
     * @return long
     */
    long count(Predicate predicate);

    /**
     * 删除
     *
     * @param id ID
     */
    void removeById(ID id);

    /**
     * 删除
     *
     * @param entity T
     */
    void deleteAndFlush(T entity);

    /**
     * 刷新入库
     */
    void flush();
}
